// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

#ifndef msr_airlib_BarometerSimpleParams_hpp
#define msr_airlib_BarometerSimpleParams_hpp

#include "common/Common.hpp"
#include "common/AirSimSettings.hpp"

namespace msr
{
namespace airlib
{

    struct BarometerSimpleParams
    {
        //user specified sea level pressure is specified in hPa units
        real_T qnh = EarthUtils::SeaLevelPressure / 100.0f; // hPa

        //sea level min,avh,max = 950,1013,1050 ie approx 3.65% variation
        //regular pressure changes in quiet conditions are taken as 1/20th of this
        //Mariner's Pressure Atlas, David Burch, 2014
        //GM process may generate ~70% of sigma in tau interval
        //This means below config may produce ~10m variance per hour

        //https://www.starpath.com/ebooksamples/9780914025382_sample.pdf
        real_T pressure_factor_sigma = 0.0365f / 20;
        real_T pressure_factor_tau = 3600;

        /*
    Ref: A Stochastic Approach to Noise Modeling for Barometric Altimeters
         Angelo Maria Sabatini* and Vincenzo Genovese
         Sample values are from Table 1
         https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3871085/
         This is however not used because numbers mentioned in paper doesn't match experiments.

         real_T correlated_noise_sigma = 0.27f;
         real_T correlated_noise_tau = 0.87f;
         real_T uncorrelated_noise_sigma = 0.24f;
    */

        //Experiments for MEAS MS56112 sensor shows 0.021mbar, datasheet has resoultion of 0.027mbar @ 1024
        //http://www.te.com/commerce/DocumentDelivery/DDEController?Action=srchrtrv&DocNm=MS5611-01BA03&DocType=Data+Sheet&DocLang=English
        real_T uncorrelated_noise_sigma = 0.027f * 100;
        //jMavSim uses below
        //real_T uncorrelated_noise_sigma = 0.1f;

        //see PX4 param reference for EKF: https://dev.px4.io/en/advanced/parameter_reference.html
        real_T update_latency = 0.0f; //sec
        real_T update_frequency = 50; //Hz
        real_T startup_delay = 0; //sec

        void initializeFromSettings(const AirSimSettings::BarometerSetting& settings)
        {
            const auto& json = settings.settings;
            pressure_factor_sigma = json.getFloat("PressureFactorSigma", pressure_factor_sigma);
            pressure_factor_tau = json.getFloat("PressureFactorTau", pressure_factor_tau);
            uncorrelated_noise_sigma = json.getFloat("UncorrelatedNoiseSigma", uncorrelated_noise_sigma);
            update_latency = json.getFloat("UpdateLatency", update_latency);
            update_frequency = json.getFloat("UpdateFrequency", update_frequency);
            startup_delay = json.getFloat("StartupDelay", startup_delay);
        }
    };
}
} //namespace
#endif
